package com.hnist.empdemo.view.component;

import javafx.geometry.Pos;
import javafx.scene.chart.BarChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.scene.text.TextAlignment;

import java.util.List;
import java.util.Map;

/**
 * 通用柱状图组件（带数据标签显示）
 * @param <T> 数据类型
 */
public class GenericBarChart<T> {
    private BarChart<String, Number> barChart;
    private CategoryAxis xAxis;
    private NumberAxis yAxis;

    /**
     * 构造函数
     * @param data 数据列表，每个元素包含类别和数值
     */
    public GenericBarChart(List<Map.Entry<String, Number>> data) {
        initializeAxes();
        createChartData(data);
    }

    /**
     * 初始化坐标轴
     */
    private void initializeAxes() {
        xAxis = new CategoryAxis();
        yAxis = new NumberAxis();
        yAxis.setLabel("数值");
        // 扩大Y轴范围，为顶部标签预留空间
        yAxis.setUpperBound(yAxis.getUpperBound() * 1.1);
    }

    /**
     * 创建图表数据并添加顶部标签
     * @param data 数据列表
     */
    private void createChartData(List<Map.Entry<String, Number>> data) {
        barChart = new BarChart<>(xAxis, yAxis);
        // 禁用动画，避免标签位置异常
        barChart.setAnimated(false);

        XYChart.Series<String, Number> series = new XYChart.Series<>();
        series.setName("数据");

        for (Map.Entry<String, Number> entry : data) {
            XYChart.Data<String, Number> chartData = new XYChart.Data<>(
                    entry.getKey(),
                    entry.getValue()
            );

            // 添加顶部数据标签
            Label dataLabel = new Label(entry.getValue().toString());
            dataLabel.setTextAlignment(TextAlignment.CENTER);
            dataLabel.setAlignment(Pos.BOTTOM_CENTER);
            //dataLabel.setStyle("-fx-translate-y: -10;"); // 保持与创建时一致的样式
            chartData.setNode(dataLabel);

            series.getData().add(chartData);
        }

        barChart.getData().add(series);
    }

    /**
     * 获取柱状图容器
     * @return 包含柱状图的VBox
     */
    public VBox getVBox() {
        VBox vbox = new VBox();
        vbox.getChildren().add(barChart);
        return vbox;
    }

    /**
     * 更新图表数据（保留标签功能）
     * @param newData 新的数据列表
     */
    public void updateData(List<Map.Entry<String, Number>> newData) {
        barChart.getData().clear();

        XYChart.Series<String, Number> series = new XYChart.Series<>();
        series.setName("数据");

        for (Map.Entry<String, Number> entry : newData) {
            XYChart.Data<String, Number> chartData = new XYChart.Data<>(
                    entry.getKey(),
                    entry.getValue()
            );

            Label dataLabel = new Label(entry.getValue().toString());
            chartData.setNode(dataLabel);

            series.getData().add(chartData);
        }

        barChart.getData().add(series);
        // 更新Y轴范围
        yAxis.setUpperBound(yAxis.getUpperBound() * 1.1);
    }
}